<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>07_面试题2</title>
</head>
<body>

<script type="text/javascript">
  function fun(n,o) {
    console.log(o)
    return {
      fun:function(m){
        // 这个里面有了闭包：n
        return fun(m,n)
      }
    }
  }
  // 什么时候才能产生闭包？：调用外部函数才能产生新的闭包
  // 如果没有产生新的闭包（重新调用外部函数），闭包里面的数据保持不变
  // 这个调用的是外部的fun,所以闭包数据n=0（这个产生闭包了）
  var a = fun(0)
  // 这个使用对象调用的，因此掉的是里面的fun
  // 这个也调用了外部函数，但是没有东西来接收，所以闭包立马又消失了
  a.fun(1)
  a.fun(2)
  a.fun(3)//undefined,0,0,0
  // fun(0)一调用，产生闭包0，再调用fun(1)，0就输出了，产生新的闭包1。。。
  var b = fun(0).fun(1).fun(2).fun(3)//undefined,0,1,2
// 此时c里面的闭包是1：产生了新的闭包，并且有人接收
  var c = fun(0).fun(1)
  c.fun(2)
  c.fun(3)//undefined,0,1,1
</script>
</body>
</html>